﻿var express=require('express')
var session=require('express-session')
var fs=require('fs')
var bodyParser=require('body-parser')
var md5=require('md5-node')
//数据库密码使用了md5加密了的
var multiparty=require('multiparty')
//使用这个图片上传模板必须在form表单上加{enctype="multipart/form-data"}这个
//图片上传模块，既可以获取form表单的数据，也可以实现上传图片
var cookieParser=require('cookie-parser')
var DB=require('./modules/db')

var app=express()

//ejs模板渲染
app.set('view engine','ejs')

app.use(express.static('public'))
app.use('/product',express.static('public'))
app.use(express.static('upload'))
app.use('/upload',express.static('upload'))
app.use('/product/upload',express.static('upload'))
app.use(bodyParser.urlencoded({extended:false}))
app.use(cookieParser())

//remember me 实现了cookie存储账号
//session    设置了中间件，没有登录前不能进入商品页面，如忘记下面session写法
//直接百度搜索npmjs.org  里面在express-session即可
app.use(session({
    secret: 'keyboard cat',
    resave: false,
    saveUninitialized: true,
    cookie: {
        maxAge:1000*60*30
    },rolling:true
  }))

 // app.locals['userinfo']='1213' 全局都能访问到
//设置了中间件，没有登录前不能进入商品页面
app.use((req,res,next)=>{
    if(req.url=='/login'||req.url=="/doLogin"){
        next()
    }else{
        if(req.session.userinfo&&req.session.userinfo.username!=''){
      //prouct.ejs中用<%=userinfo.username%>  就可以访问到用户名
            app.locals['userinfo']=req.session.userinfo
            next()
        }else{
            res.redirect('/login')
        }
    }
})

app.get('/',(req,res)=>{
    res.send('111')
})

//登录页面
app.get('/login',(req,res)=>{
    var username=[]
    if(req.cookies.username){
      username=req.cookies.username
    }
   res.render('login',{
       username
   })
})

//商品页面
app.get('/product',(req,res)=>{
    DB.find('product',{},(err,data)=>{
        res.render('product',
       {data}
)
    })
})

//商品增加
app.get('/product/add',(req,res)=>{
    res.render('add')
})

//删除商品
app.get('/product/delete',(req,res)=>{
    var id=req.query.id
    DB.deleteOne('product',{'_id':new DB.ObjectID(id)},(err)=>{
        if(!err){
            res.redirect('/product')
        }
    })
})

//更改商品 mongodb数据库中每一个数据id都是ObjectID，所以用id查找时得用modules下的db.js中ObjectID
app.get('/product/edit',(req,res)=>{
    var id=req.query.id
    DB.find('product',{'_id':new DB.ObjectID(id)},function(err,data){
    
        res.render('edit',{data})
    })
  
})

//判断登录
app.post('/doLogin',(req,res)=>{
  var username=req.body.username
  var password=md5(req.body.password)
  DB.find("user",
    {
     username,
     password
    },(err,data)=>{
        if(data.length!=0){
            if(req.body.check){
                res.cookie('username',username,
                {maxAge:1000*60*3600}
              )
            }
            console.log('登录成功')
            req.session.userinfo=data[0]
            res.redirect('/product')
        }else{
            res.send("<script>alert('登录失败');location.href='/login'</script>")
        }
    }
)
})

//商品增加  表单提交
app.post('/doAdd',function(req,res){
    var form=new multiparty.Form()
    form.uploadDir='upload' //上传图片的地址 目录必须存在
    form.parse(req,function(err,fields,files){
        console.log(fields)
        var fee=fields.fee[0]
        var title=fields.title[0]
        var price=fields.price[0]
        var description=fields.description[0]
        var pic=files.pic[0].path //图片上传的地址
        console.log(pic)
        DB.insert('product',{
            title,
            fee,
            price,
            description,
            pic
        },(err,data)=>{
            if(!err){
                res.redirect('/product')//上传成功到首页
            }
        })
})
})

//商品表单更改
app.post('/doEdit',function(req,res){
    var form=new multiparty.Form()
    form.uploadDir='upload'
    form.parse(req,function(err,fields,files){
     var _id=fields._id[0]
     var title=fields.title[0]
     var fee=fields.fee
     var description=fields.description
     var price=fields.price
     var pic=files.pic[0].path
     var originalFilename=files.pic[0].originalFilename
     if(originalFilename){
        var setData={
            title,fee,description,price,pic
        }
     }else{
        var setData={
            title,fee,description,price
        }
        fs.unlink(pic,function(err,data){
            if(err) throw err;            
        })
     }
     DB.update("product",{"_id":new DB.ObjectID(_id)},setData,(err,data)=>{
         if(!err){
             res.redirect('/product')
         }
     })
    })
})

//退出登录
app.get('/loginOut',(req,res)=>{
    req.session.destroy((err)=>{
        if(err) throw err;
        res.redirect('/login')
    })
})

//搜索功能
app.post('/product',function(req,res){
    var find=req.body.find
    var list=[]
    DB.find('product',{},(err,data)=>{
    for(var i=0;i<data.length;i++){
        if(data[i].title.indexOf(find)>=0){
            list.push(data[i])
        }
    }
    res.render('product',{
        data:list
    })   
    })
})

app.listen('3000')
